package javaStudy.字符串;

public class 字符串常量池 {
    public static void main(String[] args) {

        String s1 = "abc";  //在常量池创建字符串"abc"
        String s2 = "abc";  //常量池中已经有abc，所以直接s2指向常量池abc，不会重新创建对象
        System.out.println(s1 == s2); // 输出true

        /*
        s3和s4都是通过new关键字创建的，它们在堆中各自创建了一个新的字符串对象，因此s3和s4指向的是不同的对象。
        注意，如果常量池中没有abc字符串，则会在常量池中建一个abc字符串
        意味着会创建两个对象，常量池一个，堆一个，但是指向堆空间内存，仅仅只是在常量池创建。
        */
        String s3 = new String("abc");
        String s4 = new String("abc");
        System.out.println(s3 == s4); // 输出false

        //s5.intern(),指向常量池中"hello"地址（如果常量池中存在，直接指向，不存在创建一个再指向）
        String s6 = "hello";
        String s5 = new String("hello");
        System.out.println(s5==s6);//输出false
        System.out.println(s6 == s5.intern()); // 输出true

        String s8 = "123";
        String s9 = "456";
        String s10 = "123" + "456"; //通过两个字面字符拼接，在常量池中创建字符串"123456"
        String s11 = s8 + s9; // s11字符串的连接操作，append方法会将s8和s9的值添加到StringBuilder对象中，然后toString（调用new Sting (),在堆中创建）方法会将StringBuilder对象转换为一个不可变的String对象
        String s12 = "123456";
        System.out.println(s10 == s11);//输出false
        System.out.println(s10 == s12);//输出true
    }
}
